LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

config_opencv_in_windows

2022/5/30

windows下opencv配置

最近有个大作业,有需求要在QT下使用opencv

原本想着先将opencv编译完成,然后在vscode上验证,最后直接在QT内配置即可

结果是不同的编译器编译出来的opencv是不一样的

比如要在QT下使用opencv,就要用QT的编译代码的编译器去编译opencv

所以才有了下述的vscode和QT配置两个环节。


VScode

编译

下载opencv源码,选择sources下载

地址:https://opencv.org/releases


安装CMake,选择installer下载

地址:https://cmake.org/download/


打开CMake-gui,选择源码路径,新建build为编译路径,配置用MinGW编译

第一次会出现红色警告信息,再按一次Configure就好了,没问题就可以Generate生成Makefile

然后在编译路径打开命令行,开始编译

mingw32-make

我在编译过程中报错:gcc: error: long: No such file or directory

解决:CMake配置中取消OPENCV_ENABLE_ALLOCATOR_STATS勾选


编译完成后就可以安装

mingw32-make install

安装成功后会出现一个install文件夹,这个install文件夹内就包含后续所需的文件

把install下的x64/mingw/bin路径加入环境变量,重开机


测试

测试代码:

#include "opencv2/opencv.hpp"
#include "iostream"

int main(void)
{
    cv::Mat img = cv::imread("图片的绝对路径"); 
	if (img.empty())
	{
		std::cout << "error!" << std::endl;
		return -1;
	}
		
	cv::imshow("", img);
	cv::waitKey(0);
	cv::destroyAllWindows();
	return 0;
}

假设上述编译安装install的路径为path,则我们可以通过以下命令编译

g++ -g main.cpp -o main.exe -I path/install/include -L path/install/x64/mingw/lib -l opencv_core430 -l opencv_imgcodecs430 -l opencv_highgui430

-I指定头文件目录,-L指定库目录,-l为链接库(最后三位数字表示版本,我的版本为4.30)

我通过命令行可以正常编译生成main.exe,但是运行就会有无法定位程序输入点等问题


然后我尝试将上述命令配置进vscode,也很容易,主要就是配置tasks.json

发现要指定当前工作目录为mingw64的路径,程序才能正常运行

"cwd": "F:/mingw-w64/mingw64/bin"

而这样子设置随之带来的就是代码里的路径都要设置为绝对路径(比如图片路径)

而且用c++的_getcwd()函数,获得的也是上述路径

还好只是用于验证环境,要是这样子拿来开发估计会崩溃


QT

以下编译过程最终没有使用,出现了QT和Opencv版本不均的问题

编译

要在QT内使用opencv,就要用QT编译的编译器编译opencv,有点拗口hh

QT使用的编译器在QT的安装目录下可以看见

例如我的是F:\QT5.9.0\Tools\mingw530_32\bin

需要将这个路径添加到环境变量中,然后在cmake中选择这个编译器编译


编译过程出现下列两个问题:

出错:member CMakeFiles\opencv_core.dir/objects.a(vs_version.rc.obj) in archive is not an object

解决方法:添加OPENCV_VS_VERSIONINFO_SKIP

出错:undefined reference to `_imp__opj_image_destroy@4’

解决方法:去除勾选WITH_OPENJPEG


编译完同样install,然后把install下的x64/mingw/bin文件夹加入环境变量,重开机


测试

测试代码:

#include "mainwindow.h"
#include <QApplication>
#include <opencv2/opencv.hpp>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
//    MainWindow w;

    cv::Mat image = cv::imread("图片的绝对路径");
    if (image.empty())
    {
        std::cout << "error" << "\n";
        return -1;
    }

    cv::imshow("show", image);
    cv::waitKey();


//    w.show();

    return a.exec();
}

同样假设编译安装install的路径为path,需要再在QT的.pro文件中加入

INCLUDEPATH += path/install/include/
LIBS += path/install/x86/mingw/lib/libopencv_*.a

测试的时候发现图片没法正常显示,一直显示灰色的,鼠标放上去就在转圈圈

怀疑可能是版本不兼容的问题(Opencv版本太高而QT版本太低)


为了快速验证想法(其实也是懒得再编译一次),直接下载用同样QT编译器编译生成的文件

下载链接:https://github.com/huihut/OpenCV-MinGW-Build

我的QT的编译器是mingw530_32,可以找到对应的文件

发现对应的opencv版本是3.4.5,一定程度上验证了版本差别太大的想法


下载完成后,同样把bin加入环境变量(顺便把刚刚编译后不能使用的环境变量删掉),重开机

然后同样在QT的.pro加入对应路径的include和lib

正常运行√

而且没有存在上述vscode中的路径错误的问题